// request.js
import * as Url from "../net/Url.js";
import * as Constants from "@/common/Constants";

const BASE_URL = Url.HOST; // 设置基础URL
const FACE_HOST_URL = Url.FACE_HOST; // 设置基础URL

/**
 * 网络请求
 */
function request(options) {
    // 默认配置
    const defaultOptions = {
        url: '', // 请求地址
        method: 'GET', // 请求方法
        data: {}, // 请求数据
        header: {
            // 'accept': 'application/json, text/plain, */*',
            'content-type': 'application/json;charset=utf-8;', // 默认请求头     'application/x-www-form-urlencoded' 'application/json;charset=utf-8' 'application/json' 'multipart/form-data'
            'source': 'APP',//请求来源
        },
        timeout: 30000,
    };

    // 合并用户传入的配置与默认配置
    let config = Object.assign({}, defaultOptions, options);


    // 如果存在token，添加到header中
    let token = uni.getStorageSync(Constants.TOKEN);
    if (token) {
        config.header['Authorization'] = `${token}`;
        // config.header['Authorization'] = `Bearer ${token}`;
    }

    return new Promise((resolve, reject) => {
        // 先检测网络
        getNetwork().then(res => {
            // 网络请求
            if (!config.isFileUpload) {
                // 表单请求
                if (config.isForm) {
                    config.header['content-type'] = 'application/x-www-form-urlencoded;'
                }

                // 人脸识别
                if (config.isFaceCheck) {
                    config.url = FACE_HOST_URL + config.url
                }
                // 其它请求
                else if (!config.url.startsWith('http')) {
                    config.url = BASE_URL + config.url;
                }

                console.log('request config = ', config)
                uni.request({
                    ...config,
                    success(res) {
                        resolve(reponseStatus(res, config.isFaceCheck))
                    },
                    fail(err) {
                        // 请求失败处理
                        reject(`请求失败：${err.errMsg}`);
                    }
                });
            }
            // 上传文件
            else {
                config.url = BASE_URL + config.url;
                console.log('request config = ', config)
                uni.uploadFile({
                    url: config.url,
                    filePath: config.data.filePath,
                    name: config.data.name,
                    header: {
                        'Authorization': token
                    },
                    formData: {},
                    success: (res) => {
                        res.data = JSON.parse(res.data)
                        resolve(reponseStatus(res, config.isFaceCheck))
                    },
                    fail: (err) => {
                        console.log("uploadFileRes = ", err);
                        reject(err)
                    }
                });
            }
        }).catch(err => {
            reject(err)
        })
    });
}

/**
 * 响应拦截处理
 */
const reponseStatus = (res, isFaceCheck) => {
    console.log('request result = ', res)
    return new Promise((resolve, reject) => {
        // 人脸识别
        if (isFaceCheck) {
            switch (parseInt(res.data.code)) {
                case 0:// 成功
                    resolve(res.data)
                    break
                case 100:// 未检测到人脸
                case 101:// 面部质量差
                case 102:// 活体检测未通过
                default:
                    reject(res.data)
                    console.error(`状态码${res.data.code}: 未知得错误`)
                    break
            }
        }
        // 其他接口
        else {
            switch (parseInt(res.data.code)) {
                case 200:
                    resolve(res.data)
                    break;
                case 400:
                    reject()
                    setTimeout(() => {
                        res.data.message ? uni.$u.toast(res.data.message) : ''
                    }, 300)
                    console.error('400错误:' + res.data.message)
                    break;
                case 401:
                    reject()
                    setTimeout(() => {
                        uni.$u.toast("账号未登录！")
                    }, 300)
                    // setTimeout(() => {
                    //     uni.reLaunch({
                    //         url: '/pages/login/login'
                    //     })
                    // }, 1000)
                    console.error('401错误:' + res.data.message)
                    break;
                case 403:
                    reject()
                    setTimeout(() => {
                        uni.$u.toast("该账号无权限！")
                    }, 300)
                    console.error('403错误:' + res.data.message)
                    break;
                case 404:
                    reject()
                    setTimeout(() => {
                        res.data.message ? uni.$u.toast(res.data.message) : ''
                    }, 300)
                    console.error('404未找到目标报错:' + res.data.message)
                    break;
                case 500:
                    reject()
                    if (res.data.message && res.data.message != "Internal Server Error") {
                        setTimeout(() => {
                            uni.$u.toast(res.data.message)
                        }, 300)
                    } else {
                        setTimeout(() => {
                            uni.$u.toast("服务器异常！")
                        }, 300)
                    }
                    console.error('500服务器报错:' + res.data.message)
                    break;
                default:
                    reject(res.data)
                    setTimeout(() => {
                        res.data.message ? uni.$u.toast(res.data.message) : ''
                    }, 300)
                    console.error(`状态码${res.data.code}: 未知得错误`)
            }
        }
    })
}

/**
 * 检查网络状态
 */
const getNetwork = () => {
    return new Promise((resolve, reject) => {
        uni.getNetworkType({
            success: (res) => {
                if (res.networkType !== 'none') {
                    resolve('')
                } else {
                    reject('网络未连接');

                    //TODO 跳转网络页面
                    // uni.navigateTo({
                    //     url: '/pages/netWork/netWork'
                    // })
                }
            },
            fail: (err) => {
                reject(err);
                //TODO 跳转网络页面
                // uni.navigateTo({
                //     url: '/pages/netWork/netWork'
                // })
                // this.$API(proxy).Toast('请查看当前网络连接是否正常', 'error')
            }
        });
    })
}

export default request;